#include "dibujo.h"
#include "parametros.h"

#include <iostream>
using namespace std;

DibujoCirculo::DibujoCirculo()
{
    x = 0;
    y = 0;
    radio = rand() * 4 / RAND_MAX + 2;
    contador = 0;
    vuelta = false;
}

DibujoCirculo::~DibujoCirculo()
{
    //dtor
}

void DibujoCirculo::pintar(QPainter *painter)
{
    QRectF rectanguloElipse(x - radio, y - radio, radio * 2, radio * 2);

    QBrush brocha(QColor(Qt::green));
    painter->setBrush(brocha);
    painter->drawEllipse(rectanguloElipse);
}

void DibujoCirculo::actualizar()
{
    //clock_t reloj = clock();

    // CLOCKS_PER_SEC * 10; // CLOCKS_PER_SEC = unidades de clock que tiene un segundo

    contador += vuelta ? - 1 : +1;
    if (contador > 20)
    {
        vuelta = true;

    }
    else if (contador < 0)
    {
        vuelta = false;

    }

    if (vuelta)
    {
        x -= .2;
        y -= .2;
    }
    else
    {
        x += .2;
        y += .2;
    }
}


#define LADO_IMAGEN lado //( lado * ANCHO_VENTANA / (xmax - xmin) )
#define NUMERO_CIRCULOS 10 // Numero de circulos visibles a la vez
#define PASO            1 // cada actualizacion avanza 1 pixel
#define PASOS_POR_BANDA ( LADO_IMAGEN / (NUMERO_CIRCULOS * 2) )
#define RADIO_MAXIMO    ( LADO_IMAGEN / 2 * sqrt(2) + PASOS_POR_BANDA )

DibujoArcoiris::DibujoArcoiris() : imagen(LADO_IMAGEN, LADO_IMAGEN, QImage::Format_RGB32)
{
    contador = PASOS_POR_BANDA;
    regenerarImagen = true;
}

void DibujoArcoiris::pintar(QPainter *painter)
{
    if (regenerarImagen)
    {
        regenerarImagen = false;
        QPainter painterImagen(&imagen);
        painterImagen.setRenderHint(QPainter::Antialiasing, true);
        pintarArcoiris(&painterImagen);
        painterImagen.end();

    }
    painter->drawImage(-lado/2, 0, imagen);
}



void DibujoArcoiris::pintarArcoiris(QPainter *painter)
{

    // Fondo blanco
    QBrush brochaBlanca(QColor(0xFFFFFF));
    painter->setPen(Qt::NoPen);
    painter->setBrush(brochaBlanca);
    painter->drawRect(0, 0, LADO_IMAGEN, LADO_IMAGEN);

    painter->setPen(Qt::NoPen);
    QRectF rectanguloCirculo;
    int desp = lado / 2;

    int dx = desp;
    int dy = desp;
    for (list<pair<real,int> >::iterator i = bandas.begin(); i != bandas.end(); i++)
    {
        real radio = (*i).first;
        rectanguloCirculo.setCoords(- radio + dx, - radio + dy, radio + dx, radio + dy);
        QBrush brocha(QColor((*i).second));
        painter->setBrush(brocha);
        painter->drawEllipse(rectanguloCirculo);
    }
}

void DibujoArcoiris::actualizar()
{
    contador++;

    if (contador > PASOS_POR_BANDA)
    {
        contador = 0;
        real r = rand();
        bandas.push_back(pair<real,int>(0, static_cast<int>(r * 0x00FFFFFF / RAND_MAX)));
    }


    bool sacar = false;
    for (list<pair<real,int> >::iterator i = bandas.begin(); i != bandas.end(); i++)
    {
        (*i).first += PASO;
        if ((*i).first > RADIO_MAXIMO)
            sacar = true;
    }

    if (sacar)
    {
        bandas.pop_front();
    }

    regenerarImagen = true;
}



